experimentI.m
Calculates the equilibrium entry and exit thresholds presented in Table I of Abbring and Campbell's ''Last-In First-Out Oligopoly Dynamics.''
Contents
- Set grid of innovation variances examined.
- Set remaining parameters.
- Baseline specification
- Write the baseline specification's panel for Table I.
- Write table elements referenced in the text to LaTeX macros
- Specification with exogenously limited entry
- Write the limited entry specification's panel for Table I.
- Display computation time.
Set grid of innovation variances examined.
sigmaG=[0 0.05 0.1 0.15];
Set remaining parameters.
This section creates the structures with all parameters required for the model's solution. Some of these are replaced later when cycling through the grid points.
% Parameters for approximating the innovation distribution approximateARG.F=@(x) (1+erf(x/sqrt(2)))./2; approximateARG.Frange=4.0; approximateARG.k=51; % Parameters for approximating the Markov chain. markovARG.approximateARG=approximateARG; markovARG.rho=1.0; markovARG.sigma=0.30; %Placeholder value markovARG.omegaCenter=0.0; markovARG.omegaStep=0.005; markovARG.omegaWidth=3; % Parameters describing profits and discounting. bellmanARG.k=4; bellmanARG.piF = @(x) bellmanARG.k*ones(size(x)); bellmanARG.kappa=1.75; bellmanARG.beta=1.05^(-1); %5 percent annual interest rate. bellmanARG.phi = @(N) 0.25*bellmanARG.beta/(1-bellmanARG.beta); bellmanARG.markovARG=markovARG;
Baseline specification
% Mark cpu time for efficiency calculations. tstart=cputime; % Cycle through the parameter values and calculate the statistics of interest. nPoints=length(sigmaG); entryThresholds=NaN(nPoints,1); % Vectors for storing thresholds from the experiments. exitThresholds=NaN(nPoints,1); exitRate=NaN(nPoints,1); % Vector for storing each experiment's ergodic exit rate. for iter=1:nPoints; markovARG.sigma=sigmaG(iter); bellmanARG.markovARG=markovARG; %Calculate equilibrium continuation values. bellman %Calculate entry and exit rules' threshold representations. thresholds entryThresholds(iter,1:maxN)=overlineC'; exitThresholds(iter,1:maxN)=underlineC'; %Pad storage results with NaNs if required (assumes that maxN decreases as sigma increases. if maxN<size(entryThresholds,2) entryThresholds(iter,maxN+1:end)=NaN; exitThresholds(iter,maxN+1:end)=NaN; end %Calculate average exit rate. ergodic; nVec=kron((minN:1:maxN)',ones(nCstates,1)); nprimeVec=nPrime(:); dN=nprimeVec-nVec; Eexit=v(dN<0)'*(dN(dN<0)./nVec(dN<0)); Eexit=Eexit/sum(v(nVec>0)); exitRate(iter)=100*abs(Eexit); clear Pi %This triggers the recalculation of the approximating Markov chain on the next trip through this loop. end
Write the baseline specification's panel for Table I.
doublerule='Yes'; %Switch to add the double rule at the panel's top. descstr='$\pi(N)=4$'; %String to describe the results in the panel's first row. latextableI; %Write the two panels to a LaTeX file f1=fopen('ac2aExperimentIa.tex','w'); for i=1:1:size(tablestra,1) fprintf(f1,'%s \n',tablestra(i,:)); end fprintf(f1,'\n \\medskip \n \n'); for i=1:1:size(tablestrb,1) fprintf(f1,'%s \n',tablestrb(i,:)); end fclose(f1);
Write table elements referenced in the text to LaTeX macros
This automation creates an audit trail for these numbers.
f1=fopen('ac2aExperimentIText.tex','w'); % \overline{C}_5 for \sigma=0.20 and \sigma=0.30 fprintf(f1,'\\def\\cFiveSigmaTwo{$%3.2f$}\n',entryThresholds(3,5)); fprintf(f1,'\\def\\cFiveSigmaThree{$%3.2f$}\n',entryThresholds(4,5)); % \overline{C}_6 for \sigma=0.1 and \sigma=0.2 fprintf(f1,'\\def\\cSixSigmaOne{$%3.2f$}\n',entryThresholds(2,6)); fprintf(f1,'\\def\\cSixSigmaTwo{$%3.2f$}\n',entryThresholds(3,6)); % \overline{C}_7 for \sigma=0 and \sigma=0.1 fprintf(f1,'\\def\\cSevenSigmaZero{$%3.2f$}\n',entryThresholds(1,7)); fprintf(f1,'\\def\\cSevenSigmaOne{$%3.2f$}\n',entryThresholds(2,7)); % The first static exit threshold. fprintf(f1,'\\def\\cOneSigmaZero{$%3.2f$}\n',exitThresholds(1,1)); % Exit rates fprintf(f1,'\\def\\exitRateOne{$%2.1f$}\n',exitRate(2)); fprintf(f1,'\\def\\exitRateTwo{$%2.1f$}\n',exitRate(3)); fprintf(f1,'\\def\\exitRateThree{$%2.1f$}\n',exitRate(4)); fclose(f1);
Specification with exogenously limited entry
This computation proceeds analogously to that for the baseline specification.
bellmanARG.piF = @(x) bellmanARG.k*ones(size(x)).*(x<=bellmanARG.k); maxN1=size(exitThresholds,2); %Number of possible entrants before limiting entry. entryThresholds=NaN(nPoints,1); exitThresholds=NaN(nPoints,1); for iter=1:nPoints; markovARG.sigma=sigmaG(iter); bellmanARG.markovARG=markovARG; bellman thresholds entryThresholds(iter,1:maxN)=overlineC'; exitThresholds(iter,1:maxN)=underlineC'; %Pad storage results with NaNs if required (assumes that maxN decreases as sigma increases. if maxN<size(entryThresholds,2) entryThresholds(iter,maxN+1:end)=NaN; exitThresholds(iter,maxN+1:end)=NaN; end clear Pi end % Add columns of NaN's to entry and exit thresholds so that the tables from this experiment have the same format as those from the previous experiment. if size(entryThresholds,2)<maxN1; entryThresholds=[entryThresholds NaN(nPoints,maxN1-size(entryThresholds,2))]; exitThresholds = [exitThresholds NaN(nPoints,maxN1-size(exitThresholds,2))]; end
Write the limited entry specification's panel for Table I.
%Create the tables of interest doublerule='No'; descstr='$\pi(N)=4\times I\left\{N\leq 4\right\}$'; latextableI; %Write the two panels to a LaTeX file f1=fopen('ac2aExperimentIb.tex','w'); for i=1:1:size(tablestra,1) fprintf(f1,'%s \n',tablestra(i,:)); end fprintf(f1,'\n \\medskip \n \n'); for i=1:1:size(tablestrb,1) fprintf(f1,'%s \n',tablestrb(i,:)); end fclose(f1);
Display computation time.
disp(['Experiment took ' num2str(cputime-tstart,'%6.2f') ' seconds']);
Experiment took 105.11 seconds